package chapter_3;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;

/**
 * 对基本数据类型（整型）进行编码与解码
 * @author sunfulv
 * @date 2021.07.07
 */
public class BruteForceCoding {

    /**
     * 将任意长度的整型数转换为大端序的字节数组
     * @param bytes 保存编码结果的字节数组
     * @param val 要转换的整型数值
     * @param offset 转换后的编码在字节数组中的偏移量
     * @param size 编码的字节长度（写到字节数组中的字节数）
     * @return 字节数组中新的偏移量（空字节的位置）
     */
    public static int encodeIntBigEndian(byte[] bytes, long val, int offset, int size){
        long mask = 0xFF;
        int end = offset + size - 1;
        for(int i = end; i >= offset; i--){
            bytes[i] = (byte) (val & mask);
            val = val >> 8;
        }
        return end;
    }

    /**
     * 对字节数组中的按大端序排列的字节编码进行解码
     * @param bytes 存放字节编码的字节数组
     * @param offset 字节编码在字节数组中的偏移量
     * @param size 字节编码的长度
     * @return 解码得到的整型
     */
    public static long decodeIntBigEndian(byte[] bytes, int offset, int size){
        long val = 0;
        for(int i = 0; i < size; i++){
            val = (val << 8) | ((long)bytes[offset + i] & 0xFF);
        }
        return val;
    }

    public static void main(String[] args) {
        byte[] bytes = new byte[8];
        int offset = 0;
        int size = 8;
        encodeIntBigEndian(bytes, 10000000001L, offset, size);
        System.out.println(decodeIntBigEndian(bytes, offset, size));
        System.out.println("完成");

        String str = "使用java自带的方法将整型数字转换为对应的二进制补码字节数组";
        System.out.println("------------------\"使用java自带的方法将整型数字转换为对应的二进制补码字节数组\"----------");
        long x = 10L;
        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        DataOutputStream dataOut = new DataOutputStream(byteArrayOut);
        try {
            dataOut.writeLong(x);
        }catch(IOException e){
            e.printStackTrace();
        }
        byte[] bytesByOutStream = byteArrayOut.toByteArray();
        System.out.println("------------结束-------------");

    }
}
